package persistence;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.core.Is.is;
import models.Cadeau;
import models.Utilisateur;
import org.junit.After;
import org.junit.Test;
import play.test.Fixtures;
import play.test.UnitTest;

public class UnEntrepotDUtilisateurDevrait extends TestDePersistence {
	
	@Test
	public void persisterUnUtilisateur() {
		Utilisateur utilisateur = new Utilisateur("jb", "jb.renaudin@gmail.com", "9IOS83DI");
		utilisateur.save();

		Utilisateur recupere = Utilisateur.recupereParEmail("jb.renaudin@gmail.com");
		assertThat(recupere.surnom, equalTo("jb"));
		assertThat(recupere.email, equalTo("jb.renaudin@gmail.com"));
		assertThat(recupere.motDePasse, equalTo("9IOS83DI"));
		assertThat(recupere.cadeaux.size(), equalTo(0));
		assertThat(recupere.amis.size(), equalTo(0));
	}
	
	@Test
	public void persisterUnUtilisateurAvecSaListeDeCadeaux() {
		Utilisateur utilisateur = new Utilisateur("jb", "jb.renaudin@gmail.com", "9IOS83DI");
		Cadeau photocopieur = utilisateur.ajouteCadeau("Photocopieur");
		Cadeau slip = utilisateur.ajouteCadeau("Un slip en peau d'ours");
		
		utilisateur.save();

		Utilisateur recupere = Utilisateur.recupereParEmail("jb.renaudin@gmail.com");
		assertThat(recupere.cadeaux.size(), equalTo(2));
		assertThat(recupere.cadeaux.get(0), equalTo(photocopieur));
		assertThat(recupere.cadeaux.get(1), equalTo(slip));
	}
	
	@Test
	public void persisterUnUtilisateurAvecSaListeOrdonneeDAmis() {
		Utilisateur ami1 = new Utilisateur("jul", "julien.chabanne@gmail.com", "IOJSKIDJ").save();
		Utilisateur ami2 = new Utilisateur("ben", "benoit.grange@gmail.com", "PLOMSP").save();

		Utilisateur utilisateur = new Utilisateur("jb", "jb.renaudin@gmail.com", "9IOS83DI");
		utilisateur.ajouteAmi(ami1);
		utilisateur.ajouteAmi(ami2);
		utilisateur.save();

		Utilisateur recupere = Utilisateur.recupereParEmail("jb.renaudin@gmail.com");
		assertThat(recupere.amis.size(), equalTo(2));
		assertThat(recupere.amis.get(0), equalTo(ami2));
		assertThat(recupere.amis.get(1), equalTo(ami1));
	}

	@Test(expected = Exception.class)
	public void verifierQueLeSurnomEstUnique() {
		new Utilisateur("toto", "toto@gmail.com", "9IOS83DI").save();
		new Utilisateur("toto", "titi@gmail.com", "783JEU").save();
	}

	@Test(expected = Exception.class)
	public void verifierQueLeSurnomEstObligatoire() {
		new Utilisateur(null, "toto@gmail.com", "9IOS83DI").save();
	}

	@Test(expected = Exception.class)
	public void verifierQueLEmailEstUnique() {
		new Utilisateur("toto", "toto@gmail.com", "9IOS83DI").save();
		new Utilisateur("titi", "toto@gmail.com", "783JEU").save();
	}

	@Test(expected = Exception.class)
	public void verifierQueLEmailEstObligatoire() {
		new Utilisateur("toto", null, "9IOS83DI").save();
	}

	@Test(expected = Exception.class)
	public void verifierQueLeMotDePasseEstObligatoire() {
		new Utilisateur("jul", "julien.chabanne@gmail.com", null).save();
	}

	@Test
	public void determinerSiUnUtilisateurExisteViaSonEmailEtMotDePasse() {
		new Utilisateur("toto", "tata@gmail.com", "7SHDG4HE").save();
		assertThat(Utilisateur.existe("tata@gmail.com", "7SHDG4HE"), is(true));
	}

	@Test
	public void recupererUnUtilisateurViaSonSurnom() {
		Utilisateur utilisateur = new Utilisateur("pierre", "pierre.guole@gmail.com", "7SEDG4HE").save();
		Utilisateur recupere = Utilisateur.recupereParSurnom("pierre");
		assertThat(recupere, equalTo(utilisateur));
	}
	
	@Test
	public void recupererUnUtilisateurViaSonEmail() {
		Utilisateur utilisateur = new Utilisateur("pierre", "pierre.guole@gmail.com", "7SEDG4HE").save();
		Utilisateur recupere = Utilisateur.recupereParEmail("pierre.guole@gmail.com");
		assertThat(recupere, equalTo(utilisateur));
	}
}
